/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.cliente.contacto.vista;

import co.com.entities.Contacto;
import co.com.entities.TipoDocumento;
import co.com.client.BaseView.CreateBase;
import co.com.cliente.Services;
import co.com.cliente.contacto.estructura.ContactoDS;
import co.com.cliente.contacto.estructura.ContactoRecord;
import co.com.cliente.tipoDocumento.estructura.TipoDocumentoDS;
import co.com.cliente.tipoDocumento.estructura.TipoDocumentoRecord;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author dloaiza
 */
public class ContactoEdition extends CreateBase {

    private Contacto contacto;
    private HLayout accionesContacto;
    private DynamicForm frmContacto;
    private TextItem txtidentificacion, txtnombre, txtapellido1, txtapellido2, txttelefono, txtextension, txttelefonoCelular, txtcorreo;
    private Button btnGuardar, btnLimpiar, btnEliminar;
    private SelectItem cbxtipoDocumento;
    private ListGrid contactoGrid;
    private TipoDocumentoDS tipoDocumentoDS;

    public ContactoEdition() {
        super("Creación de Contacto", "100%");
        initComponents();
    }

    private void initComponents() {

        tipoDocumentoDS = new TipoDocumentoDS();

        txtidentificacion = new TextItem();
        txtidentificacion.setTitle("Identificación");
        txtidentificacion.setWidth(200);
        txtidentificacion.setRequired(true);
        txtidentificacion.setName("txtidentificacion");
        txtidentificacion.setLength(30);
        txtidentificacion.setAlign(Alignment.LEFT);
        txtidentificacion.setWrapTitle(false);

        txtnombre = new TextItem();
        txtnombre.setTitle("Nombre(s)");
        txtnombre.setWidth(200);
        txtnombre.setRequired(true);
        txtnombre.setName("txtnombre");
        txtnombre.setLength(150);
        txtnombre.setAlign(Alignment.LEFT);
        txtnombre.setWrapTitle(false);

        txtapellido1 = new TextItem();
        txtapellido1.setTitle("Apellido 1");
        txtapellido1.setWidth(200);
        txtapellido1.setRequired(true);
        txtapellido1.setName("txtapellido1");
        txtapellido1.setLength(50);
        txtapellido1.setAlign(Alignment.LEFT);
        txtapellido1.setWrapTitle(false);

        txtapellido2 = new TextItem();
        txtapellido2.setTitle("Apellido 2");
        txtapellido2.setWidth(200);
        txtapellido2.setName("txtapellido2");
        txtapellido2.setLength(50);
        txtapellido2.setAlign(Alignment.LEFT);
        txtapellido2.setWrapTitle(false);

        txttelefono = new TextItem();
        txttelefono.setTitle("Teléfono");
        txttelefono.setWidth(200);
        txttelefono.setRequired(true);
        txttelefono.setName("txttelefono");
        txttelefono.setLength(10);
        txttelefono.setAlign(Alignment.LEFT);
        txttelefono.setWrapTitle(false);

        txtextension = new TextItem();
        txtextension.setTitle("Extensión");
        txtextension.setWidth(200);
        txtextension.setName("txtextension");
        txtextension.setLength(10);
        txtextension.setAlign(Alignment.LEFT);
        txtextension.setWrapTitle(false);

        txttelefonoCelular = new TextItem();
        txttelefonoCelular.setTitle("Celular");
        txttelefonoCelular.setWidth(200);
        txttelefonoCelular.setName("txttelefonoCelular");
        txttelefonoCelular.setLength(25);
        txttelefonoCelular.setAlign(Alignment.LEFT);
        txttelefonoCelular.setWrapTitle(false);

        txtcorreo = new TextItem();
        txtcorreo.setTitle("Email");
        txtcorreo.setWidth(200);
        txtcorreo.setName("txtcorreo");
        txtcorreo.setLength(250);
        txtcorreo.setAlign(Alignment.LEFT);
        txtcorreo.setWrapTitle(false);
        txtcorreo.setRequired(true);


        btnGuardar = new Button("Guardar");

        btnLimpiar = new Button("Limpiar");

        btnEliminar = new Button("Eliminar");

        contactoGrid = new ListGrid();
        contactoGrid.setWidth100();
        contactoGrid.setHeight100();
        contactoGrid.setDataSource(new ContactoDS());
        contactoGrid.setAutoFetchData(true);
        contactoGrid.setFields(ContactoRecord.getFields());
        contactoGrid.setEmptyMessage("No hay registros para mostrar");
        contactoGrid.setSelectionType(SelectionStyle.SIMPLE);
        contactoGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        contactoGrid.setFilterOnKeypress(true);
        contactoGrid.setShowFilterEditor(true);
        contactoGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() {
            @Override
            public void onRecordDoubleClick(RecordDoubleClickEvent event) {
                contacto = (Contacto) event.getRecord().getAttributeAsObject("Contacto");
                txtidentificacion.setValue(contacto.getDsidentificacion());
                txtapellido1.setValue(contacto.getDsapellido1());
                txtapellido2.setValue(contacto.getDsapellido2()==null?"":contacto.getDsapellido2());
                txtcorreo.setValue(contacto.getDscorreo()==null?"":contacto.getDscorreo());
                txtextension.setValue(contacto.getDsextension()==null?"":contacto.getDsextension());
                txtnombre.setValue(contacto.getDsnombre());
                txttelefono.setValue(contacto.getDstelefono()==null?"":contacto.getDstelefono());
                txttelefonoCelular.setValue(contacto.getDstelefonoCelular()==null?"":contacto.getDstelefonoCelular());
                cbxtipoDocumento.setValue(contacto.getNmidTipoDocumento().getDstipoDocumento());
                txtidentificacion.setDisabled(true);
            }
        });


        cbxtipoDocumento = new SelectItem();
        cbxtipoDocumento.setTitle("Tipo documento");
        cbxtipoDocumento.setName("cbxtipoDocumento");
        cbxtipoDocumento.setRequired(true);
        cbxtipoDocumento.setWidth(200);
        cbxtipoDocumento.setDisplayField(TipoDocumentoDS.DSTIPOIDENTIFICACION);
        cbxtipoDocumento.setValueField(TipoDocumentoDS.DSTIPOIDENTIFICACION);
        cbxtipoDocumento.setAlign(Alignment.LEFT);
        cbxtipoDocumento.setWrapTitle(false);

        accionesContacto = new HLayout();
        accionesContacto.setMargin(20);
        accionesContacto.setMembersMargin(20);
        accionesContacto.setHeight(50);
        accionesContacto.setWidth("100%");
        accionesContacto.setAlign(Alignment.CENTER);
        accionesContacto.setMembers(btnGuardar, btnLimpiar, btnEliminar);

        frmContacto = new DynamicForm();
        frmContacto.setNumCols(4);
        frmContacto.setItems(txtidentificacion, txtnombre, txtapellido1, txtapellido2, txttelefono, txtextension, txttelefonoCelular, txtcorreo, cbxtipoDocumento);

        AddActionBarItem(accionesContacto);

        VLayout contenedor = new VLayout();
        contenedor.setMembers(frmContacto, contactoGrid);
        AddFormContainerItem(contenedor);

        btnGuardar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (frmContacto.validate()) {

                    if (contacto == null) {
                        Services.getContactoServices().guardarContacto(getContacto(), new AsyncCallback<Void>() {
                            public void onFailure(Throwable caught) {
                                SC.say("Error en creación de contacto", caught.getMessage());
                            }

                            public void onSuccess(Void result) {
                                SC.say("Creación de contacto", "Señor usuario, el contacto fue registrado correctamente");
                                asteroideLoad();
                            }
                        });
                    } else {
                        Services.getContactoServices().actualizarContacto(getContacto(), new AsyncCallback<Void>() {
                            public void onFailure(Throwable caught) {
                                SC.say("Error en actualización de contacto", caught.getMessage());
                            }

                            public void onSuccess(Void result) {
                                SC.say("Actualización de contacto", "Señor usuario, el contacto fue actualizado correctamente");
                                asteroideLoad();
                            }
                        });
                    }

                }
            }
        });
        btnLimpiar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                frmContacto.clearValues();
                txtidentificacion.setDisabled(false);
            }
        });
        btnEliminar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                ListGridRecord[] selectedRecords = contactoGrid.getSelection();
                final List<Contacto> contactoToDelete = new ArrayList<Contacto>(selectedRecords.length);


                for (ListGridRecord rec : selectedRecords) {
                    contactoToDelete.add((Contacto) rec.getAttributeAsObject("Contacto"));
                }
                if (contactoToDelete.isEmpty()) {

                    SC.warn("Debe seleccionar al menos un contacto para poder eliminar");
                    return;
                } else {
                    SC.confirm("Confirmar Eliminación", "¿Esta seguro que desea eliminar los contactos seleccionados?", new BooleanCallback() {
                        @Override
                        public void execute(Boolean value) {
                            if (value) {
                                AsyncCallback<Void> updateStateCallback = new AsyncCallback<Void>() {
                                    @Override
                                    public void onFailure(Throwable caught) {
                                        Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo... no se pudo eliminar el producto debido a: " + caught.getMessage());
                                        SC.say("Eliminación de contactos", caught.getMessage());
                                    }

                                    @Override
                                    public void onSuccess(Void result) {
                                        SC.say("Eliminación de contactos", "Señor usuario, el(los) contacto(s) se han eliminado correctamente");
                                        asteroideLoad();
                                    }
                                };
                                Services.getContactoServices().eliminarContactos(contactoToDelete, updateStateCallback);
                            }
                        }
                    });
                }
            }
        });

        cargarUnidad();
        asteroideLoad();
    }

    private void asteroideLoad() {
        Services.getContactoServices().consultarContactos(new AsyncCallback<List<Contacto>>() {
            public void onFailure(Throwable caught) {
                caught.getMessage();
            }

            public void onSuccess(List<Contacto> result) {
                clearResults();
                DataSource ds = contactoGrid.getDataSource();
                for (int i = 0; i < result.size(); i++) {
                    ds.addData(new ContactoRecord(result.get(i)));
                }
            }
        });
    }

    private void clearResults() {
        DataSource ds = contactoGrid.getDataSource();
        for (ListGridRecord record : contactoGrid.getRecords()) {
            ds.removeData(record);
        }
    }

    public Contacto getContacto() {
        if (contacto == null) {
            contacto = new Contacto();
        }
        TipoDocumento tipoDocumento = cbxtipoDocumento.getSelectedRecord().getAttributeAsObject("TipoDocumento") == null ? null : (TipoDocumento) cbxtipoDocumento.getSelectedRecord().getAttributeAsObject("TipoDocumento");

        contacto.setDsidentificacion(txtidentificacion.getValueAsString());
        contacto.setDsapellido1(txtapellido1.getValueAsString());
        contacto.setDsapellido2(txtapellido2.getValueAsString());
        contacto.setDscorreo(txtcorreo.getValueAsString());
        contacto.setDsextension(txtextension.getValueAsString());
        contacto.setDsnombre(txtnombre.getValueAsString());
        contacto.setDstelefono(txttelefono.getValueAsString());
        contacto.setDstelefonoCelular(txttelefonoCelular.getValueAsString());
        contacto.setNmidTipoDocumento(tipoDocumento);
        return contacto;
    }
    
    public void cargarUnidad() {
        Services.getTipoDocumentoServices().consultarTipoDocumentos(new AsyncCallback<List<TipoDocumento>>() {

            public void onFailure(Throwable caught) {
                Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo...no se cargaron los cargos de empleados: " + caught.getMessage());
            }

            public void onSuccess(List<TipoDocumento> unidades) {

                for (int i = 0; i < unidades.size(); i++) {
                    tipoDocumentoDS.addData(new TipoDocumentoRecord(unidades.get(i)));
                }
                cbxtipoDocumento.setOptionDataSource(tipoDocumentoDS);
            }
        });
    }
}